<?php
/**
 * 数据调用接口
 */
class controller_tasks extends controller_base {
	/**
	 * index
	 */
	public function action_index() {
		p($this->task_list());
		
	}
	
	/**
	 * list
	 */
	public function action_list() {
		$model_tasks = new model_tasks();
		$res = $model_tasks->find_all(1);
		
		$this->assign('res', $res);
	}
	
	/**
	 * form
	 */
	public function action_form() {}
	
	/**
	 * save
	 */
	public function action_save() {
		$model_tasks = new model_tasks();
		
		$data = $_POST['data'];
		$time = explode(':', $_POST['data']['time']);
		$data['time'] = $time[0]*60 + $time[1];
		$data['time'] > 1440 && $data['time'] = 1440;
		$data['enable'] = 1;
		
		$model_tasks->create($data);
		
		$this->message('添加成功', './?m=tasks&a=list');
	}
	
	/**
	 * 计时器
	 */
	public function action_timing() {
		// 不限时
		set_time_limit(0);
		ignore_user_abort(true);

		while (file_get_contents(ROOT.'/resource/task/enable.txt') == 'on') {
			// 记录下最后的运行时间
			file_put_contents(ROOT.'/resource/task/last_time.txt', date('Y-m-d H:i:s'));
			// 执行任务
			$this->action_execute();
			// 休息
			sleep(5);
		}
	}
	
	/**
	 * 最后时间
	 */
	public function action_last_time() {
		echo file_get_contents(ROOT.'/resource/task/last_time.txt');
	}
	
	/**
	 * 执行任务
	 */
	public function action_execute() {
		$model_tasks = new model_tasks();
		$tasks = $model_tasks->get_to_execute();
		foreach ($tasks as $task) {
			!empty($task['url']) && @file_get_contents($task['url']);
			$data['task_id'] = $task['task_id'];
			$data['last_executed'] = time();
			
			$model_tasks->update($data);
		}
		
		return $tasks;
	}
	
	/**
	 * 外部监测探针
	 */
	public function action_scan() {
		// 所有进程
		$tasks = $this->task_list();
		// 清理死进程
		foreach ($tasks as $pid->$is_alive) {
			if(time() - $task > 60) {
				$this->kill($pid);
			}
		}
	}
	
	/**
	 * 进程运行 (文件不存在会自动停止，文件存在会自动打开)
	 */
	private function run($pid) {
		// 不限时
		set_time_limit(0);
		ignore_user_abort(true);
		
		// 进程所依赖的文件
		$file = ROOT.'/resource/task/'.$pid;
		
		// 进程文件存在
		while(file_exists($file)) {
			// 执行任务
			$this->action_execute();
			// 最后执行时间
			touch($file);
			// 休息
			sleep(1);
		}
	}
	
	/**
	 * 杀死一个进程
	 * @param int $pid 进程ID
	 */
	private function kill($pid) {
		$file = ROOT.'/resource/task/'.$pid;
		file_exists($file) && unlink($file);
	}
	
	/**
	 * 新建一个进程
	 */
	private function create() {
		$pid = time();
		$file = ROOT.'/resource/task/'.$pid;
		touch($file);
		return $pid;
	}
	
	/**
	 * 是否活着
	 */
	private function is_alive($pid) {
		$file = ROOT.'/resource/task/'.$pid;
		return time() - fileatime($file) < 60;
	}
	
	/**
	 * 进程列表
	 */
	private function task_list() {
		$path = ROOT.'/resource/task/';
		$files = scandir($path);
		$task_list = array();

		// 扫描进程文件
		foreach ($files as $file_name) {
			$file = $path.$file_name;
			is_file($file) && $task_list[] = $file_name;
		}
		
		return $task_list;
	}
}